# Makefile for FastAPI Demo Project
# 提供统一的命令接口，简化开发工作流

# ============================================================================
# 操作系统检测
# ============================================================================

# 检测操作系统
ifeq ($(OS),Windows_NT)
    DETECTED_OS := Windows
    SHELL_EXT := .ps1
    SHELL_CMD := pwsh -NoProfile -ExecutionPolicy Bypass -File
else
    UNAME_S := $(shell uname -s)
    ifeq ($(UNAME_S),Linux)
        DETECTED_OS := Linux
    else ifeq ($(UNAME_S),Darwin)
        DETECTED_OS := macOS
    else
        DETECTED_OS := Unix
    endif
    SHELL_EXT := .sh
    SHELL_CMD := bash
endif

# ============================================================================
# 帮助信息
# ============================================================================

.PHONY: help
help: ## 📚 显示所有可用命令及说明（默认任务）
	@echo "可用命令："
	@echo ""
	@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "  \033[36m%-20s\033[0m %s\n", $$1, $$2}'
	@echo ""
	@echo "使用方法: make <命令>"

.DEFAULT_GOAL := help

# ============================================================================
# 环境管理
# ============================================================================

.PHONY: install
install: ## 📦 安装所有依赖（生产 + 开发）
	@echo "📦 安装项目依赖..."
	uv sync
	@echo "✅ 依赖安装完成！"

.PHONY: install-dev
install-dev: ## 📦 仅安装开发依赖
	@echo "📦 安装开发依赖..."
	uv sync --dev
	@echo "✅ 开发依赖安装完成！"

.PHONY: update
update: ## 🔄 更新所有依赖到最新兼容版本
	@echo "🔄 更新项目依赖..."
	uv sync --upgrade
	@echo "✅ 依赖更新完成！"

.PHONY: env
env: ## 🔄 更新 .env.example 文件
	@echo "🔄 更新 .env 文件..."
	uv run -m scripts.generate_env
	@echo "✅ .env 文件更新完成！"

# ============================================================================
# 项目初始化
# ============================================================================

.PHONY: init
init: ## 🚀 初始化项目开发环境（安装依赖、配置 hooks、生成 .env）
	@echo "🚀 初始化开发环境 ($(DETECTED_OS))..."
	@$(SHELL_CMD) scripts/init$(SHELL_EXT)

# ============================================================================
# 开发服务器
# ============================================================================

.PHONY: run
run: ## 🚀 启动服务器
	@echo "🚀 启动 FastAPI 服务器..."
	uv run -m app.main

.PHONY: dev
dev: ## 🚀 启动服务器（调试模式）
	@echo "🚀 启动 FastAPI 开发服务器..."
	DEBUG=true uv run -m app.main

# ============================================================================
# 代码质量检查
# ============================================================================

.PHONY: format
format: ## 🎨 运行 Ruff 格式化（自动修复）
	@echo "🎨 格式化 Python 代码..."
	uv run ruff format .
	@echo "✅ 代码格式化完成！"

.PHONY: lint
lint: ## 🔍 运行 Ruff Lint 检查
	@echo "🔍 运行 Lint 检查..."
	uv run ruff check .

.PHONY: lint-fix
lint-fix: ## 🔧 运行 Ruff Lint 检查并自动修复
	@echo "🔧 运行 Lint 检查并自动修复..."
	uv run ruff check --fix .
	@echo "✅ Lint 问题已修复！"

.PHONY: typecheck
typecheck: ## 🔬 运行 Pyright 类型检查
	@echo "🔬 运行类型检查..."
	uv run pyright

.PHONY: check-all
check-all: lint typecheck test ## ✅ 运行所有质量检查（lint + typecheck + test）
	@echo "✅ 所有质量检查通过！"

# ============================================================================
# 测试
# ============================================================================

.PHONY: test
test: ## 🧪 运行所有测试
	@echo "🧪 运行所有测试..."
	uv run pytest

.PHONY: test-unit
test-unit: ## 🧪 仅运行单元测试
	@echo "🧪 运行单元测试..."
	uv run pytest tests/unit

.PHONY: test-cov
test-cov: ## 📊 运行测试并生成覆盖率报告
	@echo "📊 运行测试并生成覆盖率报告..."
	uv run pytest --cov=app --cov-report=html --cov-report=term-missing
	@echo "✅ 覆盖率报告已生成：htmlcov/index.html"

.PHONY: test-watch
test-watch: ## 👀 监控模式运行测试（文件变化时自动重跑）
	@echo "👀 启动测试监控模式..."
	uv run pytest-watch

# ============================================================================
# Git Hooks
# ============================================================================

.PHONY: pre-commit
pre-commit: ## 🪝 安装 pre-commit Git hooks
	@echo "🪝 安装 pre-commit hooks..."
	uv run pre-commit install
	@echo "✅ Git hooks 安装完成！"

.PHONY: pre-commit-update
pre-commit-update: ## 🔄 更新 pre-commit hooks 到最新版本
	@echo "🔄 更新 pre-commit hooks..."
	uv run pre-commit autoupdate
	@echo "✅ Hooks 更新完成！"

.PHONY: pre-commit-run
pre-commit-run: ## 🔍 手动运行 pre-commit 检查（不提交）
	@echo "🔍 运行 pre-commit 检查..."
	uv run pre-commit run --all-files

# ============================================================================
# 清理
# ============================================================================

.PHONY: clean
clean: ## 🧹 清理临时文件和缓存
	@echo "🧹 清理临时文件..."
	@echo "  - 删除 Python 缓存..."
	@find . -type d -name "__pycache__" -exec rm -rf {} + 2>/dev/null || true
	@find . -type f -name "*.pyc" -delete 2>/dev/null || true
	@echo "  - 删除测试缓存..."
	@rm -rf .pytest_cache 2>/dev/null || true
	@echo "  - 删除 Ruff 缓存..."
	@rm -rf .ruff_cache 2>/dev/null || true
	@echo "  - 删除覆盖率报告..."
	@rm -rf htmlcov .coverage 2>/dev/null || true
	@echo "✅ 清理完成！"

.PHONY: clean-all
clean-all: clean ## 🧹 深度清理（包括虚拟环境和锁文件）
	@echo "⚠️  深度清理（删除 .venv 和 uv.lock）..."
	@rm -rf .venv uv.lock 2>/dev/null || true
	@echo "✅ 深度清理完成！重新运行 'make install' 以恢复环境"
